<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <li class="first">01</li>

</body>
<script>
    function Cat(name, color) {
        // {}
        // {}[[Prototype]] = Cat.prototype;
        // this -> {}

        // 我们要做的操作 -> 把属性和方法绑定到构造函数的实例化对象中
        this.name = name;
        this.color = color;

        // return this;
    }

    // 原型对象 -> Cat.prototype
    Cat.prototype.species = "Cat";
    Cat.prototype.call = function () {
        console.log("喵喵");
    };
    Cat.prototype.skill = function () {
        console.log("捉老鼠");
    };
    Cat.prototype.say = function () {
        // this指向谁?  调用此方法的实例化对象
        console.log("this指向:", this);
        console.log(this.name, this.color);
    }

    Object.prototype.a = 1;
    Object.prototype.b = 2;




</script>
<script>
    // Object 原型对象的方法
    // toString()   将其他类型转化为字符串类型
    // valueOf()    返回实例化对象的值

    var num = 1;
    var str = "hello";
    var bool = true;
    var arr = [1, 2, 3];
    var obj = { a: 1, b: 2 };  // new Object()
    var Tom = new Cat("Tom", "black");

    // var date = new Date();
    // console.dir(date);

    // console.log(num.valueOf());
    // console.log(str.valueOf());
    // console.log(bool.valueOf());
    // console.log(arr.valueOf());
    // console.log(obj.valueOf());
    // console.log(Tom.valueOf());
    // console.log(date.valueOf());


    // isPrototypeOf()    判断 某个构造函数的原型对象 是否存在于 某个实例化对象的 原型链上

    // Tom原型链:
    // Tom  ->  Cat.prototype  -> Object.prototype -> null

    // console.log(Cat.prototype.isPrototypeOf(Tom));  // true
    // console.log(Object.prototype.isPrototypeOf(Tom));  // true
    // console.log(Array.prototype.isPrototypeOf(Tom));  // false

    // 补充
    // instanceof   判断 某个实例化对象 的原型链上是否存在  某个构造函数  的原型对象
    // console.log(Tom instanceof Cat); // true
    // console.log(Tom instanceof Object); // true
    // console.log(Tom instanceof Array); // false


    // hasOwnProperty(key)  传入一个字符串(键名),判断该键名是否存在实例化对象上(只查找实例化对象本身 不查找原型链)
    // console.log(Tom);
    // console.log(Tom.hasOwnProperty("name"));  // true
    // console.log(Tom.hasOwnProperty("color")); // true
    // console.log(Tom.hasOwnProperty("species"));  // false
    // console.log(Tom.hasOwnProperty("a"));  // false
    // console.log(Tom.hasOwnProperty("b"));  // false


    // 补充
    // 如何查找原型链上是否存在某个属性?   => "xxx" in 对象
    console.log(Tom);

    // for (var key in Tom) {
    //     console.log(key);
    // }

    // console.log("name" in Tom);  // true
    // console.log("color" in Tom);  // true
    // console.log("species" in Tom); // true
    // console.log("say" in Tom); // true
    // console.log("a" in Tom); // true
    // console.log("b" in Tom); // true


    // propertyIsEnumerable()   传入一个属性,判断属性是否可以被枚举(遍历) (只查找实例化对象本身 不查找原型链)
    console.log(Tom.propertyIsEnumerable("name"));  // true
    console.log(Tom.propertyIsEnumerable("color")); // true
    console.log(Tom.propertyIsEnumerable("species")); //false
    console.log(Tom.propertyIsEnumerable("say")); //false
    console.log(Tom.propertyIsEnumerable("a")); //false
    console.log(Tom.propertyIsEnumerable("b"));//false


    var li = document.getElementsByClassName("first")[0];
    console.dir(li)












</script>

</html>